package com.cencat.common.constant;

import lombok.Getter;

/**
 * 错误码枚举
 * 统一管理系统错误码
 */
@Getter
public enum ErrorCode {
    
    /**
     * 成功
     */
    SUCCESS(200, "成功"),
    
    /**
     * 系统错误
     */
    SYSTEM_ERROR(500, "系统错误"),
    
    /**
     * 参数错误
     */
    PARAM_ERROR(1001, "参数错误"),
    
    /**
     * 数据不存在
     */
    DATA_NOT_EXIST(1002, "数据不存在"),
    
    /**
     * 数据已存在
     */
    DATA_EXIST(1003, "数据已存在"),
    
    /**
     * 数据操作失败
     */
    DATA_OPERATE_FAILED(1004, "数据操作失败"),
    
    /**
     * 权限不足
     */
    PERMISSION_DENIED(2001, "权限不足"),
    
    /**
     * 禁止访问
     */
    FORBIDDEN(403, "禁止访问"),
    
    /**
     * 未登录
     */
    UNAUTHORIZED(2002, "未登录"),
    
    /**
     * Token过期
     */
    TOKEN_EXPIRED(2003, "Token过期"),
    
    /**
     * Token无效
     */
    TOKEN_INVALID(2004, "Token无效"),
    
    /**
     * 租户不存在
     */
    TENANT_NOT_EXIST(3001, "租户不存在"),
    
    /**
     * 租户已禁用
     */
    TENANT_DISABLED(3002, "租户已禁用"),
    
    /**
     * 租户套餐已过期
     */
    TENANT_PACKAGE_EXPIRED(3003, "租户套餐已过期"),
    
    /**
     * 租户用户数超限
     */
    TENANT_USER_LIMIT(3004, "租户用户数超限"),
    
    /**
     * 租户存储空间不足
     */
    TENANT_STORAGE_LIMIT(3005, "租户存储空间不足"),
    
    /**
     * 租户API调用超限
     */
    TENANT_API_LIMIT(3006, "租户API调用超限"),
    
    /**
     * 文件上传失败
     */
    FILE_UPLOAD_FAILED(4001, "文件上传失败"),
    
    /**
     * 文件类型不支持
     */
    FILE_TYPE_NOT_SUPPORTED(4002, "文件类型不支持"),
    
    /**
     * 文件大小超限
     */
    FILE_SIZE_EXCEEDED(4003, "文件大小超限"),
    
    /**
     * 文件不存在
     */
    FILE_NOT_EXIST(4004, "文件不存在"),
    
    /**
     * AI服务不可用
     */
    AI_SERVICE_UNAVAILABLE(5001, "AI服务不可用"),
    
    /**
     * AI模型不存在
     */
    AI_MODEL_NOT_EXIST(5002, "AI模型不存在"),
    
    /**
     * AI调用超限
     */
    AI_CALL_LIMIT(5003, "AI调用超限"),
    
    /**
     * AI响应超时
     */
    AI_RESPONSE_TIMEOUT(5004, "AI响应超时"),
    
    /**
     * 低代码应用不存在
     */
    LOWCODE_APP_NOT_EXIST(6001, "低代码应用不存在"),
    
    /**
     * 低代码表单不存在
     */
    LOWCODE_FORM_NOT_EXIST(6002, "低代码表单不存在"),
    
    /**
     * 低代码流程不存在
     */
    LOWCODE_WORKFLOW_NOT_EXIST(6003, "低代码流程不存在"),
    
    /**
     * 低代码组件不存在
     */
    LOWCODE_COMPONENT_NOT_EXIST(6004, "低代码组件不存在"),
    
    /**
     * 数据库连接失败
     */
    DB_CONNECTION_FAILED(7001, "数据库连接失败"),
    
    /**
     * 数据库操作失败
     */
    DB_OPERATION_FAILED(7002, "数据库操作失败"),
    
    /**
     * 缓存操作失败
     */
    CACHE_OPERATION_FAILED(8001, "缓存操作失败"),
    
    /**
     * 网络连接失败
     */
    NETWORK_CONNECTION_FAILED(9001, "网络连接失败"),
    
    /**
     * 第三方服务异常
     */
    THIRD_PARTY_SERVICE_ERROR(9002, "第三方服务异常"),
    
    /**
     * 未知错误
     */
    UNKNOWN_ERROR(9999, "未知错误");
    
    /**
     * 错误码
     */
    private final int code;
    
    /**
     * 错误消息
     */
    private final String message;
    
    ErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }
    
    /**
     * 根据错误码获取错误码枚举
     * @param code 错误码
     * @return 错误码枚举
     */
    public static ErrorCode getByCode(int code) {
        for (ErrorCode errorCode : values()) {
            if (errorCode.getCode() == code) {
                return errorCode;
            }
        }
        return UNKNOWN_ERROR;
    }
    
    /**
     * 判断是否为成功状态码
     * @param code 状态码
     * @return 是否为成功状态码
     */
    public static boolean isSuccess(int code) {
        return code == SUCCESS.getCode();
    }
    
    /**
     * 判断是否为失败状态码
     * @param code 状态码
     * @return 是否为失败状态码
     */
    public static boolean isError(int code) {
        return !isSuccess(code);
    }
}